#include "cqtgpsSingle.h"
#include <QDebug>

// 饿汉模式的关键：初始化即实例化
CQtGpsSingle *CQtGpsSingle::m_instanse=new CQtGpsSingle();

// 垃圾回收对象定义
CQtGpsSingle::GarbageCollector CQtGpsSingle::gc;

CQtGpsSingle::CQtGpsSingle(QObject *parent) : QSerialPort(parent)
{
    paraInit();

    connect(this,&CQtGpsSingle::readyRead,this,&CQtGpsSingle::dealRec);
}

CQtGpsSingle::CQtGpsSingle(const QSerialPortInfo &serialPortInfo, QObject *parent): QSerialPort(serialPortInfo,parent)
{
    paraInit();
    connect(this,&CQtGpsSingle::readyRead,this,&CQtGpsSingle::dealRec);
}

CQtGpsSingle::CQtGpsSingle(const QString &strPortName, QSerialPort::BaudRate baud, QObject *parent)
{
    this->setParent(parent);
    paraInit();
    this->setPortName(strPortName);
    this->setBaudRate(baud);
    connect(this,&CQtGpsSingle::readyRead,this,&CQtGpsSingle::dealRec);

    //测试QString与datatime转换
    //_currentTime = QDateTime::fromString("2012-07-23 15:30:20", "yyyy-MM-dd hh:mm:ss");
    //    _ss=0;
    //    _mm=5;
    //    _hh=0;
    //    _DD=2;
    //    _MM=3;
    //    _YY=2333;
    //    QString time=QString("%1-%2-%3 %4:%5:%6").arg(_YY,4,10,QLatin1Char('0')).arg(_MM,2,10,QLatin1Char('0')).arg(_DD,2,10,QLatin1Char('0')).arg(_hh,2,10,QLatin1Char('0')).arg(_mm,2,10,QLatin1Char('0')).arg(_ss,2,10,QLatin1Char('0'));
    //    qDebug()<<time;
    //    QString time1="2333-03-02 00:05:00";//"2010-07-02 17:35:00";
    //    _currentTime = QDateTime::fromString(time, "yyyy-MM-dd hh:mm:ss");
    //    qDebug()<<_currentTime.toString("yyyy-MM-dd hh:mm:ss");
}

void CQtGpsSingle::setSerialPara(const QString &strPortName, QSerialPort::BaudRate baud)
{
    this->setPortName(strPortName);
    this->setBaudRate(baud);
}

int CQtGpsSingle::GetYY() const
{
    return _YY;
}

int CQtGpsSingle::GetMM() const
{
    return _MM;
}

int CQtGpsSingle::GetDD() const
{
    return _DD;
}

int CQtGpsSingle::Gethh() const
{
    return _hh;
}

int CQtGpsSingle::Getmm() const
{
    return _mm;
}

int CQtGpsSingle::Getss() const
{
    return _ss;
}

int CQtGpsSingle::Getms() const
{
    return _ms;
}

QDateTime CQtGpsSingle::getCurrentTime() const
{
    return _currentTime;
}

QList<QSerialPortInfo> CQtGpsSingle::getPortInfo()
{
    return QSerialPortInfo::availablePorts();
}

float CQtGpsSingle::getLongitude() const
{
    return _longitude;
}

float CQtGpsSingle::getLatitude() const
{
    return _latitude;
}

QString CQtGpsSingle::getLongitudeSign() const
{
    return _longitudeSign;
}

QString CQtGpsSingle::getLatitudeSign() const
{
    return _latitudeSign;
}

void CQtGpsSingle::paraInit() //初始化参数
{
    _ss=0;
    _mm=0;
    _hh=0;
    _DD=0;
    _MM=0;
    _YY=0;
    _currentTime=QDateTime::currentDateTime();
    this->_latitude=0.0f;
    this->_latitudeSign=tr("E");
    this->_longitude=0.0f;
    this->_longitudeSign=tr("W");
    this->setReadBufferSize(2048);
}


void CQtGpsSingle::dealRec()
{
    //qDebug()<<tr("rec------------------------------------------");
    if(!this->canReadLine()) return;
    //读取串口数据
    QByteArray readComData = this->readAll();
    //qDebug()<<"daxiao-----------"<<readComData.count();
    //将读到的数据显示到数据接收区
    if(readComData != NULL)
    {
        //        // $GNZDA（当前时间信息）$GNZDA,095555.000,08,12,2015,00,00*4C=>2015-12-08 09:55:55
        //        if(readComData.contains("$GNZDA"))
        //        {
        //            QList<QByteArray> gpsByteArrays = readComData.split(',');
        //            int fIndex=0;
        //            fIndex=gpsByteArrays.indexOf("$GNZDA");
        //            if(fIndex!=-1&& gpsByteArrays.count()-fIndex>=6) //GNZDA
        //            {
        //                _hh=gpsByteArrays.at(fIndex+1).mid(0,2).toInt();//UTC时间 hhmmss
        //                _mm=gpsByteArrays.at(fIndex+1).mid(2,2).toInt();
        //                _ss=gpsByteArrays.at(fIndex+1).mid(4,2).toInt();
        //                _DD=gpsByteArrays.at(fIndex+2).toInt();
        //                _MM=gpsByteArrays.at(fIndex+3).toInt();
        //                _YY=gpsByteArrays.at(fIndex+4).toInt();
        //                QString time=QString("%1-%2-%3 %4:%5:%6").arg(_YY,4,10,QLatin1Char('0'))
        //                        .arg(_MM,2,10,QLatin1Char('0')).arg(_DD,2,10,QLatin1Char('0'))
        //                        .arg(_hh,2,10,QLatin1Char('0')).arg(_mm,2,10,QLatin1Char('0'))
        //                        .arg(_ss,2,10,QLatin1Char('0'));
        //                _currentTime = QDateTime::fromString(time, "yyyy-MM-dd hh:mm:ss");
        //            }
        //        }


        //$GNRMC（推荐定位信息 $GNRMC,095554.000,A,2318.1327,N,11319.7252,E,000.0,005.7,081215,,,A*73
        if(readComData.contains("$GNRMC"))
        {
            //qDebug()<<tr("231313132312");
            QList<QByteArray> gpsByteArrays = readComData.split(',');
            int fIndex=0;
            fIndex=gpsByteArrays.indexOf("$GNRMC");
            if(fIndex!=-1&& gpsByteArrays.count()-fIndex>=12) //GPRMC
            {
                _hh=gpsByteArrays.at(fIndex+1).mid(0,2).toInt()+8;//UTC时间 hhmmss 需要加8小时
                _mm=gpsByteArrays.at(fIndex+1).mid(2,2).toInt();
                _ss=gpsByteArrays.at(fIndex+1).mid(4,2).toInt();
                _ms=gpsByteArrays.at(fIndex+1).mid(7,3).toInt(); //0-999ms

                _DD=gpsByteArrays.at(fIndex+9).mid(0,2).toInt();
                _MM=gpsByteArrays.at(fIndex+9).mid(2,2).toInt();
                _YY=gpsByteArrays.at(fIndex+9).mid(4,2).toInt()+2000;

                if(_hh>=24)
                {
                    _hh-=24;
                    _DD+=1;
                }

                QString time=QString("%1-%2-%3 %4:%5:%6.%7").arg(_YY,4,10,QLatin1Char('0'))
                        .arg(_MM,2,10,QLatin1Char('0')).arg(_DD,2,10,QLatin1Char('0'))
                        .arg(_hh,2,10,QLatin1Char('0')).arg(_mm,2,10,QLatin1Char('0'))
                        .arg(_ss,2,10,QLatin1Char('0')).arg(_ms,3,10,QLatin1Char('0'));
                _currentTime = QDateTime::fromString(time, "yyyy-MM-dd hh:mm:ss.zzz");

                _latitude=gpsByteArrays.at(fIndex+3).toInt();
                _latitudeSign=gpsByteArrays.at(fIndex+4).toStdString().c_str();
                _longitude=gpsByteArrays.at(fIndex+5).toInt();
                _longitudeSign=gpsByteArrays.at(fIndex+6).toStdString().c_str();
                emit signalGetReady(); //接受一次有效数据就发送一次信号
            }
        }

    }
    //qDebug()<<_YY <<_MM<< _DD <<_hh<<_mm<<_ss<<_currentTime.toString("yyyy-MM-dd hh:mm:ss")<<_latitude<<_latitudeSign<<_longitude<<_longitudeSign;
    //清除缓冲区
    readComData.clear();

}
